package io.nutz.nutzsite.module.monitor.services;

import io.nutz.nutzsite.common.base.Service;
import io.nutz.nutzsite.common.shiro.session.OnlineSessionDAO;
import io.nutz.nutzsite.common.utils.AddressUtils;
import io.nutz.nutzsite.common.utils.DateUtils;
import io.nutz.nutzsite.common.utils.ShiroUtils;
import io.nutz.nutzsite.common.utils.StringUtils;
import io.nutz.nutzsite.module.monitor.models.UserOnline;
import io.nutz.nutzsite.module.sys.models.User;

import java.util.Date;
import java.util.List;

import org.apache.shiro.session.Session;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.log.Log;
import org.nutz.log.Logs;
import org.nutz.mvc.Mvcs;

import eu.bitwalker.useragentutils.UserAgent;

/**
 * 在线用户记录 服务层实现
 * 
 * @author haiming
 * @date 2019-04-18
 */
@IocBean(args = {"refer:dao"})
public class UserOnlineService extends Service<UserOnline> {
	private static final Log log = Logs.get();
	@Inject
	private Dao dao;
	@Inject 
	private OnlineSessionDAO onlineSessionDAO;
	
	public UserOnlineService(Dao dao) {
		super(dao);
	}

    /**
     * 通过会话序号查询信息
     * 
     * @param sessionId 会话ID
     * @return 在线用户信息
     */

    public UserOnline selectOnlineById(String sessionId)
    {
        return dao.fetch(UserOnline.class,sessionId);
    }

    /**
     * 通过会话序号删除信息
     * 
     * @param sessionId 会话ID
     * @return 在线用户信息
     */

    public void deleteOnlineById(String sessionId)
    {
        UserOnline userOnline = selectOnlineById(sessionId);
        if (StringUtils.isNotNull(userOnline))
        {
        	dao.delete(UserOnline.class,sessionId);
        }
    }

    /**
     * 通过会话序号删除信息
     * 
     * @param sessions 会话ID集合
     * @return 在线用户信息
     */

    public void batchDeleteOnline(List<String> sessions)
    {
        for (String sessionId : sessions)
        {
            UserOnline userOnline = selectOnlineById(sessionId);
            if (StringUtils.isNotNull(userOnline))
            {
            	dao.delete(UserOnline.class,sessionId);
            }
        }
    }

    /**
     * 保存会话信息
     * 
     * @param online 会话信息
     */
    public void saveOnline(UserOnline online)
    {
    	dao.insert(online);
    }

    /**
     * 查询会话集合
     * 
     * @param pageUtilEntity 分页参数
     */
    public List<UserOnline> selectUserOnlineList(UserOnline userOnline)
    {
    	Cnd cnd=Cnd.NEW();
    	String ipaddr=userOnline.getIpaddr();
    	if (ipaddr != null && ipaddr != "")
    		cnd.and("ipaddr","like", ('%'+ipaddr+'%'));
    	String loginName=userOnline.getLoginName();
		if (loginName != null && loginName != "")
			cnd.and("login_name","like", ('%'+loginName+'%'));
	
        return dao.query(UserOnline.class, cnd);
    }

    /**
     * 强退用户
     * 
     * @param sessionId 会话ID
     */
    public void forceLogout(String sessionId)
    {
        Session session = onlineSessionDAO.readSession(sessionId);
        if (session == null)
        {
            return;
        }
        session.setTimeout(1000);
        deleteOnlineById(sessionId);
    }

    /**
     * 查询会话集合
     * 
     * @param online 会话信息
     */
    public List<UserOnline> selectOnlineByExpired(Date expiredDate)
    {
        String lastAccessTime = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, expiredDate);
        return dao.query(UserOnline.class, Cnd.where("last_access_time","<=",lastAccessTime));
    }
    /**
     * 检查sessions有效性后，更新
     * 
     * @param sessionId 会话ID
     */
    public void updateSessions()
    {
    	log.info("\r\nus....\r\n");
    	List<UserOnline> listuserol=dao.query(UserOnline.class,null);
    	for (UserOnline userOnline : listuserol) {
    		String sessionId=userOnline.getSessionId();
    		Session session = onlineSessionDAO.readSession(sessionId);
    		if (session == null)
            {
            	deleteOnlineById(sessionId);
            }
		} 
    }
}